package command

import (
	"flag"
	"fmt"
	"gitee.com/huanminabc/go-utils/vars"
	"go-LineScriptCommand/container"
	"strings"
)

type BooksShowCmd struct {
	doc      string //接收输入变量
	priority int    //优先级
}

func init() {
	RegisterCommand(&BooksShowCmd{
		priority: 1,
	})
}

// 绑定
func (m *BooksShowCmd) Bind() {
	flag.StringVar(&m.doc, m.GetName(), "", m.GetDesc())
}

// 满足条件才执行命令
func (m *BooksShowCmd) Condition() bool {
	return m.doc != ""
}

// 执行命令
func (m *BooksShowCmd) Execute() {

	//创建map
	mapType := container.GetMapType()
	funMap := make(map[string][]string)
	//遍历map
	for k, v := range mapType {
		funMap[k] = make([]string, len(v))
		for i, v1 := range v {
			funMap[k][i] = container.GetFunctionName(v1)
		}
	}

	//然后遍历map
	for k, v := range funMap {
		for i, fun := range v {
			docs := container.ExecuteFun(fun, "-doc")
			if docs != "" {
				//截取第1行有内容的
				docSp := strings.Split(docs, "\n")
				doc := ""
				for _, v1 := range docSp {
					//去除空格
					v1 = strings.TrimSpace(v1)
					if v1 != "" {
						doc = v1
						//去掉开头的功能:
						doc = strings.Replace(doc, "功能:", "", 1)
						doc = strings.TrimSpace(doc)
						break
					}
				}
				funMap[k][i] = fun + "->" + doc
			}
		}
	}
	for {
		fmt.Printf("================图书目录================\n")
		fmt.Printf("1.base:常用基础函数(文本处理,条件,循环,搜索......)\n")
		fmt.Printf("2.math:数学函数\n")
		fmt.Printf("3.date:时间函数\n")
		fmt.Printf("4.network:网络函数\n")
		fmt.Printf("5.workbox:工具箱函数\n")

		fmt.Printf("输入目录名称查看目录内函数列表,输入exit退出\n")
		fmt.Print("->:")

		//控制台输入
		var input string
		_, err := fmt.Scanln(&input)
		if err != nil {
			fmt.Println(vars.RedColor("输入错误,请重新输入"))
			continue
		}
		//判断输入
		if input == "exit" {
			return
		}
		//判断是否存在
		if _, ok := funMap[input]; ok {
			fmt.Println("================函数列表================")
			for i, v := range funMap[input] {
				fmt.Printf("%d.%s\n", i+1, v)
			}
			//请输入函数名称查看函数详情
			fmt.Printf("请输入函数名称查看函数详情,输入up返回上一级,输入exit退出\n")
			for {
				fmt.Print("->:")
				//控制台输入
				_, err = fmt.Scanln(&input)
				if err != nil {
					fmt.Println(vars.RedColor("输入错误,请重新输入"))
					continue
				}
				//判断输入
				if input == "exit" {
					return
				}
				if input == "up" {
					break
				}
				if container.IsExistFun(input) {
					doc := container.ExecuteFun(input, "-doc")
					//排除空行
					docSp := strings.Split(doc, "\n")
					var newStr strings.Builder
					var startLine = true
					for _, v1 := range docSp {
						//去除空格
						v1 = strings.TrimSpace(v1)
						if v1 != "" {
							//判断如果是第一行,加高亮
							if startLine {
								v1 = vars.GreenColor(v1)
								startLine = false
							}
							newStr.WriteString(v1 + "\n")
						}
					}
					fmt.Print(newStr.String())
				} else {
					fmt.Println(vars.RedColor("函数不存在"))
				}
			}
		} else {
			fmt.Println(vars.RedColor("目录不存在"))
		}
	}

}

// 获取命令名称
func (m *BooksShowCmd) GetName() string {
	return "books"
}

// 获取命令描述
func (m *BooksShowCmd) GetDesc() string {
	return "图书馆(函数分类), 根据提示操作即可。"
}

// 优先级  ,0最低...
func (m *BooksShowCmd) GetPriority() int {
	return m.priority
}

// 是否终止
func (m *BooksShowCmd) IsExit() bool {
	return true
}
